package furns.web;

import com.google.gson.Gson;
import furns.entity.Cart;
import furns.entity.CartItem;
import furns.entity.Furn;
import furns.service.FurnService;
import furns.service.impl.FurnServiceImpl;
import furns.utils.DataUtils;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("all")
@WebServlet(name = "CartServlet", urlPatterns = "/cartServlet")
public class CartServlet extends BasicServlet {
    //创建一个FurnService对象，用于调用FurnServiceImpl中的方法
    private FurnService furnService = new FurnServiceImpl();

    /**
     * 添加商品到购物车
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void addItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取家居id
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        //根据id获取家居信息
        Furn furn = furnService.queryFurnById(id);
        //判断家居对象是否为空
        if (furn == null) {
            return;
        }
        //只有furn家居对象的库存大于0时，才将家居对象添加到购物车中
        if (furn.getStock() > 0) {
            //由于furn对象和cartitem对象的数据模型不一样(比如furn对象有库存属性，而cartitem对象没有)，因此不能直接将furn对象放入购物车。
            // 需要利用furn对象信息创建一个cartitem对象
            CartItem item = new CartItem(furn.getId(), furn.getName(), furn.getPrice(), 1, furn.getPrice());
            //得到session中的Cart对象。即购物车
            Cart cart = (Cart) request.getSession().getAttribute("cart");
            //判断该购物车对象是否为存在。若不存在，则需要创建一个空的购物车对象用来存放商品信息
            if (cart == null) { //表示该购物车对象不存在
                cart = new Cart();
                //将购物车对象放入session中
                request.getSession().setAttribute("cart", cart);
            }
            //若购物车存在，则直接将商品对象item添加到购物车中
            cart.addItem(item);
//            System.out.println(cart);
            //数据添加完毕后，需要返回到添加家居的页面
            String referer = request.getHeader("Referer"); //从请求头中获取 请求的来源地址
            response.sendRedirect(referer);
        }

    }

    /**
     * 通过ajax请求添加商品到购物车
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void addItemByAjax(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取家居id
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        //根据id获取家居信息
        Furn furn = furnService.queryFurnById(id);
        //判断家居对象是否为空
        if (furn == null) {
            return;
        }
        //只有furn家居对象的库存大于0时，才将家居对象添加到购物车中
        if (furn.getStock() > 0) {
            //由于furn对象和cartitem对象的数据模型不一样(比如furn对象有库存属性，而cartitem对象没有)，因此不能直接将furn对象放入购物车。
            // 需要利用furn对象信息创建一个cartitem对象
            CartItem item = new CartItem(furn.getId(), furn.getName(), furn.getPrice(), 1, furn.getPrice());
            //得到session中的Cart对象。即购物车
            Cart cart = (Cart) request.getSession().getAttribute("cart");
            //判断该购物车对象是否为存在。若不存在，则需要创建一个空的购物车对象用来存放商品信息
            if (cart == null) { //表示该购物车对象不存在
                cart = new Cart();
                //将购物车对象放入session中
                request.getSession().setAttribute("cart", cart);
            }
            //若购物车存在，则直接将商品对象item添加到购物车中
            cart.addItem(item);
            //数据添加完毕后，需要给前端返回一个json数据。前端得到json数据后，进行局部刷新即可
            //方式：将待返回的数据放入 map集合中，然后调用工具类中的方法，将map集合转换为json格式数据。
            //     该方式更灵活，可以通过put()方法灵活的进行添加数据
            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("cartTotalCount",cart.getTotalCount());
            //创建一个gson对象,作为工具类使用
            Gson gson = new Gson();
            String resultJson = gson.toJson(resultMap);
            //将json格式数据响应给客户端
            response.getWriter().write(resultJson);

        }

    }

    /**
     * 更新家居数量
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void updateCount(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到家居id 和 数量
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        int count = DataUtils.parseInt(request.getParameter("count"), 1);
        //获取session中的cart对象
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        if (cart != null) {  //购物车不为空，则直接 修改 指定id的商品数量
            cart.updateCount(id, count);
        }
        //数据修改完毕后，需要返回到请求更新购物车的页面
        String referer = request.getHeader("Referer"); //从请求头中获取 请求的来源地址
        response.sendRedirect(referer);
    }

    /**
     * 删除指定id的商品
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void deleteItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取家居id
        int id = DataUtils.parseInt(request.getParameter("id"), 0);
        //获取session中的cart对象
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        if (cart != null) {
            cart.deleteItem(id);
        }
        //数据修改完毕后，需要返回到请求更新购物车的页面
        String referer = request.getHeader("Referer"); //从请求头中获取 请求的来源地址
        response.sendRedirect(referer);
    }

    /**
     * 清空购物车
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void clear(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session中的cart对象
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        if (cart != null) {
            cart.clear();
        }
        //数据修改完毕后，需要返回到请求更新购物车的页面
        String referer = request.getHeader("Referer"); //从请求头中获取 请求的来源地址
        response.sendRedirect(referer);
    }
}